home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / perl / perl5a1.lha / perl5alpha1 / do / truncate < prev    next >
Encoding:
Text File  |  1992-08-15  |  1.2 KB  |  56 lines

  1. int                    /*SUPPRESS 590*/
  2. do_truncate(TARG,arg,gimme,arglast)
  3. STR *TARG;
  4. register ARG *arg;
  5. int gimme;
  6. int *arglast;
  7. {
  8.     register ARRAY *ary = stack;
  9.     register int sp = arglast[0] + 1;
  10.     off_t len = (off_t)str_gnum(ary->ary_array[sp+1]);
  11.     int result = 1;
  12.     STAB *tmpstab;
  13.  
  14. #if defined(HAS_TRUNCATE) || defined(HAS_CHSIZE)
  15. #ifdef HAS_TRUNCATE
  16.     if ((arg[1].arg_type & A_MASK) == A_WORD) {
  17.     tmpstab = arg[1].arg_ptr.arg_stab;
  18.     if (!stab_io(tmpstab) || !stab_io(tmpstab)->ifp ||
  19.       ftruncate(fileno(stab_io(tmpstab)->ifp), len) < 0)
  20.         result = 0;
  21.     }
  22.     else if (truncate(str_get(ary->ary_array[sp]), len) < 0)
  23.     result = 0;
  24. #else
  25.     if ((arg[1].arg_type & A_MASK) == A_WORD) {
  26.     tmpstab = arg[1].arg_ptr.arg_stab;
  27.     if (!stab_io(tmpstab) || !stab_io(tmpstab)->ifp ||
  28.       chsize(fileno(stab_io(tmpstab)->ifp), len) < 0)
  29.         result = 0;
  30.     }
  31.     else {
  32.     int tmpfd;
  33.  
  34.     if ((tmpfd = open(str_get(ary->ary_array[sp]), 0)) < 0)
  35.         result = 0;
  36.     else {
  37.         if (chsize(tmpfd, len) < 0)
  38.         result = 0;
  39.         close(tmpfd);
  40.     }
  41.     }
  42. #endif
  43.  
  44.     if (result)
  45.     str_sset(TARG,&str_yes);
  46.     else
  47.     str_sset(TARG,&str_undef);
  48.     STABSET(TARG);
  49.     ary->ary_array[sp] = TARG;
  50.     return sp;
  51. #else
  52.     fatal("truncate not implemented");
  53. #endif
  54. }
  55.  
  56.